基本的Python函数和输出

时间:2014-09-26 20:41:54

标签: python

如果你有

def dog(x):
     x = 5
x = 7
dog(x)
print(x)

这会打印5或7吗?我可以看到为什么它会打印5,因为x被重新分配,但是当我在终端中运行它时,我得到7。

4 个答案:

答案 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

有关scoping rulesscopes and namespaces的详情。