请考虑以下代码:
>>> b = 3
>>> def change (b):
... b = 2
...
>>> change(b)
>>> print(b)
3
我并不感到困惑的是,print语句返回3.这里的问题是:这是因为范围,还是因为函数所采用的参数与外部b
无关?
答案 0 :(得分:1)
b
内的change
与b
之外的change
的范围不同。在函数范围内,在传递变量之前调用变量并不重要 - 现在,它将被称为b
。只要您不从b
返回change
并将其分配给“原始”b
,第一个就不会更改。
def change(b):
b = 2
return b
change(b)
print(b) # 3
b = change(b)
print(b) # 2
答案 1 :(得分:0)
这是一个范围问题。 b中的函数是局部变量。 globals()是包含所有全局变量的字典。
b=3
def change (a):
globals()[a] = 2
print b
# 3
change("b")
print b
# 2
答案 2 :(得分:0)
您正在重新分配b
。它不会更改参数。您可以在分配之前和之后使用id()
函数对此进行测试。
答案 3 :(得分:0)
范围答案对于您传递的对象类型是部分正确的。
查看此链接,了解有关python"如何通过值引用"
的信息http://stupidpythonideas.blogspot.com/2013/11/does-python-pass-by-value-or-by.html
这是另一个解释pythons Local - >的链接。附上 - >全球 - >内置示波器分辨率和一些示例:
FWIW,如果我们考虑可变对象,行为会略有不同:
>>> b = [3]
>>> def change(b):
... b[0] = 2
...
>>> change(b)
>>> print(b)
[2]
>>>
答案 4 :(得分:0)
你提出了一个非常棘手的问题,因为你在构建问题时使用的术语是让人们给你不同和奇怪的答案。
你有两个选择:
b
与函数b
无关
醇>
嗯,他们都是真的,他们真的只是两种说同样的方式。
暂时忘记术语,意识到之间存在绝对无差异
和 函数签名中的参数名称(函数的 现在,您可能已经注意到我回避了函数中的赋值问题。那是因为它很难快速解释,但对于仍然处于学习Python的相当早期阶段的人来说仍然是可以理解和难忘的(没有冒犯,似乎就是这样)。 以下是一些有助于您理解Python基本概念的阅读材料:b = 3
def f(a):
print(a)
f(b)
b = 3
def f(b):
print(b)
f(b)
def
行)是函数的本地参数,无论函数外有什么名称。
答案 5 :(得分:0)
您需要查看global variables。只需在代码和函数的开头添加global b
,它就可以运行:
>>> global b
>>> b = 3
>>> def change():
... global b
... b = 2
...
>>> b
3
>>> change()
>>> b
2
>>>
您还需要从b
中删除def change(b)
参数,因为这会b
local
和global
。您还可以return
b
:
>>> b = 3
>>> def change(b):
... b = 2
... return b
...
>>> b
3
>>> b = change(b)
>>> b
2