在 Python 中,变量用于存储可以在程序中访问和操作的值。但是,变量的作用域可能有所不同,具体取决于它是一个全局变量还是一个局部变量。Python 中的全局变量可以从程序的任何部分访问,而局部变量仅限于定义它们的函数或块。了解变量作用域之间的差异对于开发高效且有效的 Python 代码非常重要。
Python 中全局变量的作用域
Python 中的全局变量是在程序中任何函数外部定义的变量。它们可以被程序中的任何函数或模块访问和修改。
Python 中变量的作用域定义了它的可访问性。Python 中有两种作用域:全局作用域和局部作用域。全局作用域表示变量可以在整个程序中访问,而局部作用域表示变量只能在定义它的函数中访问。
示例 1:如何在 Python 中定义全局变量
# Define a global variable
global_var = 10
在 Python 中,全局变量可以从程序中的任何函数或模块访问和修改。但是,在函数内部给全局变量赋值会在该函数内创建一个新的局部变量。
以下是有关全局变量的作用域如何在 Python 中工作的示例
示例 2:在函数内访问全局变量
x = 5 #global variable
def func():
print(x) #accessing a global variable inside a function
func() #calling the function
# Output: 5
在此示例中,函数 func
正在访问任何函数外部定义的全局变量 x
。
示例 3:在函数外部访问全局变量
x = 5 #global variable
def func():
x = 10 #creating a new local variable
print(x) #accessing the local variable inside the function
func()
print(x) #accessing the global variable outside the function
# Output: 10 5
在此示例中,函数 func
通过给它赋值 10
来创建一个新的局部变量 x
。因此,函数内的print
语句指的是局部变量,而不是全局变量。但是,当函数外部调用print
语句时,它指的是全局变量 x
。
Python 中全局变量的工作原理
全局变量是可以访问和修改的变量,无论它们在哪里声明。Python 中的变量作用域决定了变量在代码不同部分的可访问性。Python 支持三种变量作用域 - 局部、全局和非局部。局部变量是在特定函数或代码块中声明和使用的变量,其作用域仅限于该特定函数或代码块。
如何在函数中更改全局变量
# declaring and initializing a global variable
global_var = "I am a global variable."
def func():
# accessing and modifying the global variable within the function
global global_var
global_var = "I have been modified."
# calling the function to modify the global variable
func()
# printing the modified value of the global variable
print(global_var) # Output: "I have been modified."
在 Python 中,要设置一个全局变量,你需要在任何函数或块之外声明并初始化一个变量。在上面的代码中,一个名为 global_var
的全局变量在函数之外声明并初始化。func()
函数使用 global
关键字访问并修改 global_var
的值。最后,打印出修改后的全局变量的值。
尝试在函数之外访问局部变量
def func():
# declaring and initializing a local variable
local_var = "I am a local variable."
print(local_var)
# calling the function that uses the local variable
func()
# trying to access the local variable outside the function
# Output: NameError: name 'local_var' is not defined
# print(local_var)
在上面的代码中,local_var
是在 func()
函数内声明并初始化的局部变量。此变量的作用域仅限于该函数。当调用该函数时,将打印 local_var
的值。但是,当我们尝试在函数之外访问此变量时,我们会得到一个 NameError
,因为该变量未在该作用域中定义。
Python 中非局部变量的作用
全局变量是可以从程序中的任何位置访问和修改的变量,而局部变量只能在特定函数或代码块内访问。变量的作用域是指可以访问它的区域。
Python 中的非局部变量是在外部函数中定义但可以在内部函数中访问的变量。nonlocal
关键字用于在 Python 中声明非局部变量。
count = 0 # global variable
def increment():
global count
count += 1
print(count)
increment() # output: 1
increment() # output: 2
在此示例中,count
是一个全局变量,可以从程序中的任何位置访问和修改。global
关键字在 increment
函数内部使用,以指示我们正在修改全局变量 count
。
def outer():
x = "local" # local variable
def inner():
nonlocal x # non-local variable
x = "nonlocal"
print("inner:", x)
inner()
print("outer:", x)
outer() # output: inner: nonlocal, outer: nonlocal
在此示例中,x
是 outer
函数中的局部变量。inner
函数使用 nonlocal
关键字访问此变量,因此我们可以修改其值。当我们调用 outer
函数时,将执行 inner
函数,并将 x
的值更改为 nonlocal
。当我们在执行 inner
函数后 print
x
的值时,此更改会反映在 outer
函数中。
global 关键字 - Python 中函数中的全局变量
让我们回顾如何在 Python 中的函数 中使用全局变量。全局变量是可以从程序的任何部分访问和修改的变量。在 Python 中,变量的作用域决定了它可以在哪里被访问。在 Python 中使用全局变量的最佳实践是尽量减少其使用,因为过多的全局变量会使程序难以理解、调试和维护。
全局变量的一个示例是 Python 中的 power 函数。我们可以使用循环来计算一个数的幂。这里有一个示例
power = 1
def calculate_power(num, exponent):
global power
power = 1
for i in range(exponent):
power *= num
return power
print("Power of 2^3 is", calculate_power(2, 3))
print("Power of 5^4 is", calculate_power(5, 4))
在此示例中,我们在函数 calculate_power()
之外声明了一个全局变量 power
。在函数内部,我们使用此全局变量来存储该数的幂。对于每次新的计算,我们将 power
变量的值重置为 1。
计算函数被调用次数的程序
count = 0
def my_function():
global count
count += 1
print("This function has been called", count, "times.")
my_function()
my_function()
my_function()
在此示例中,我们在函数 my_function()
之外声明全局变量 count
。在函数内部,我们每次调用函数时都会增加 count
变量的值。然后我们打印 count
的值。
总体而言,最好避免使用全局变量,而使用作用域更有限的局部变量。但是,在某些情况下,全局变量可能是必需的或有用的,我们可以使用 global
关键字在函数内部小心地访问它们。
Python 变量作用域和命名约定的高级技巧
Python 变量作用域的高级技巧包括尽可能避免全局变量,以防止命名冲突和意外行为。还建议使用遵循 PEP 8 命名约定 的描述性变量名称,例如使用小写字母和下划线分隔单词。
Python 中的函数命名约定遵循相同的 PEP 8 指南,使用小写字母和下划线分隔单词。函数名称也应该是描述性的,并传达函数的目的。
# Local variable
def greet(name):
message = "Hello, " + name + "!"
return message
print(greet("Alice")) # Output: Hello, Alice!
在这个示例中,我们在 greet()
函数内声明了一个局部变量 message
。此变量仅在函数内可访问,无法从外部访问。此函数接受一个 name
参数,并返回一条包含该名称的问候消息。