Python功能范围

时间:2014-04-16 18:05:13

标签: python

请考虑以下代码:

>>> b = 3
>>> def change (b):
...     b = 2
... 
>>> change(b)
>>> print(b)
3

我并不感到困惑的是,print语句返回3.这里的问题是:这是因为范围,还是因为函数所采用的参数与外部b无关?

6 个答案:

答案 0 :(得分:1)

b内的changeb之外的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 - >的链接。附上 - >全球 - >内置示波器分辨率和一些示例:

http://nbviewer.ipython.org/github/rasbt/python_reference/blob/master/not_so_obvious_python_stuff.ipynb#python_legb

FWIW,如果我们考虑可变对象,行为会略有不同:

>>> b = [3]
>>> def change(b):
...    b[0] = 2
...
>>> change(b)
>>> print(b)
[2]
>>>  

答案 4 :(得分:0)

你提出了一个非常棘手的问题,因为你在构建问题时使用的术语是让人们给你不同和奇怪的答案。

你有两个选择:

  1. 我们有一个范围问题
  2. 函数内的
  3. b与函数
  4. 之外的b无关

    嗯,他们都是真的,他们真的只是两种说同样的方式。

    暂时忘记术语,意识到之间存在绝对无差异

    b = 3
    def f(a):
        print(a)
    f(b)
    

    b = 3
    def f(b):
        print(b)
    f(b)
    

    函数签名中的参数名称(函数的def行)是函数的本地参数,无论函数外有什么名称。

    现在,您可能已经注意到我回避了函数中的赋值问题。那是因为它很难快速解释,但对于仍然处于学习Python的相当早期阶段的人来说仍然是可以理解和难忘的(没有冒犯,似乎就是这样)。

    以下是一些有助于您理解Python基本概念的阅读材料:

答案 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 localglobal。您还可以return b

>>> b = 3
>>> def change(b):
...    b = 2
...    return b
...
>>> b
3
>>> b = change(b)
>>> b
2