如果你有
def dog(x):
x = 5
x = 7
dog(x)
print(x)
这会打印5或7吗?我可以看到为什么它会打印5,因为x被重新分配,但是当我在终端中运行它时,我得到7。
答案 0 :(得分:5)
在函数体内定义的变量具有局部范围,而在外部定义的变量具有全局范围。
这意味着局部变量只能在声明它们的函数内部访问,而全局变量可以通过所有函数在整个程序体中访问。调用函数时,在其中声明的变量将进入范围。因此,当您致电dog(x)
时,dog
中的x等于5
。
为了更好地理解,请参阅下面的演示:
>>> def dog(x):
... x = 5
... print x+5
...
>>> x = 7
>>> dog(x)
10
>>> x
7
答案 1 :(得分:2)
当您致电dog(x)
时,您正在将变量x
的值复制到dog
变量x
中。但是,将dog
x
更改为另一个值并不会更改函数外部x
的值。它们是两个单独的变量,您给出了相同的标识符。
答案 2 :(得分:1)
当你写x = 7时,Python会创建一个整数对象7并为其指定名称'x',它具有全局范围
当你调用dog并将x传递给它时,你将一个指针传递给整数对象7
在狗内部,当你做x = 5时,一个具有局部范围的新名称'x'(在函数内)指向5
因为,您在打印功能7之外打印x
请注意,这只发生在不可变对象(字符串,整数,元组等)而不是可变对象(列表,字典)
如果x是一个列表:
def dog(x):
x.append(5)
x = [7]
狗(x)的
打印(x)的
输出将是[7,5]
答案 3 :(得分:0)
这是因为范围。
使用dir
可以看到当前范围内的名称。以下是一些了解范围概念的示例。
启动翻译时:
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__']
让我们添加x变量:
>>> x=5
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'x']
带参数的函数范围是什么:
>>> def dog(y):
... print dir()
...
>>> dog(1)
['y']
如您所见,x
不在其中。因此,当您定义def dog(x)
时,您之后使用的x
仅在函数范围内。
如果您想使用x
以外的dog
定义,请使用global
关键字:
>>> def dog(y):
... global x
... print dir()
...
>>> dog(1)
['y']
如您所见,x
仍未在dog
的范围内定义。但是:
>>> x
5
>>> def dog(y):
... global x
... print x
...
>>> dog(1)
5