我说的是一般情况。这是一个例子:
c = 1
def a():
def b():
print(c)
b()
c = 2
a()
此代码将返回以下错误:
NameError: free variable 'c' referenced before assignment in enclosing scope
。虽然逻辑假设是输出应该是1
。什么是Pythonic解决这个问题的方法?使用global
或nonlocal
语句(我不喜欢)?也许只是避免这种情况,多个范围共享具有相同名称的变量?
答案 0 :(得分:5)
将其作为参数传递
当将外部变量作为参数传递时,避免重用名称,除非此变量不可能将任何其他变量作为参数处理,否则它并不重要,否则如果通过d
则会引起混淆下次你在函数中对c
进行操作。
其次,即使将名称从c
更改为param
, c
的值也不会在函数中修改(它没有什么意义)当作为变量传递时,因为它不被视为全局变量,即使变量是一个对象,它也只是该函数中的一个对象,除非你将它传递给一个类。
c = 1
def a(param):
def b():
print(param)
b()
param = 2
a(c)
如果您不想将其作为参数传递,并且仍希望影响函数之外的c
,则需要坚持使用全局选项。
全局选项将影响“外部”c变量,因为您希望它...但这并不是最佳实践,如果可能,请将其视为最佳实践。
c = 1
def a():
global c
def b():
print(c)
b()
c = 2
a()
c = 1
def a(param):
def b():
print(param)
b()
param = 2
return param
c = a(c)
甚至:
c = 1
def b(param):
print(param)
def a(param):
b(param)
param = 2
return param
c = a(c)