在python中运行函数后是否更改了变量?

时间:2012-12-10 01:43:25

标签: python python-2.7

所以我从我正在阅读的书中写了这个函数,这就是它的开始:

def cheese_and_crackers(cheese_count, boxes_of_crackers):
    print "You have %d cheeses!" % cheese_count
    print "You have %d boxes of crackers!" % boxes_of_crackers
    print "Man that's enough for a party!"
    print "Get a blanket.\n"
好的,有道理。然后,这就是当这个函数运行的时候,我有点困惑,想要确认一些事情:

print "OR, we can use variables from our script:"
amount_of_cheese = 10
amount_of_crackers = 50  

cheese_and_crackers(amount_of_cheese, amount_of_crackers)

让我困惑的是,amount_of_cheese和amount_of_crackers正在改变变量(verbage?不确定我说的是正确的术语)来自cheese_count和boxes_of_crackers分别来自函数中的第一个初始变量标签。

所以我的问题是,当你使用的是与你编写的初始函数中使用的变量不同的变量时,为什么要更改你写出新变量名的AFTER的名字?如果新变量显示在新变量之后,程序将如何知道它们是什么?

我认为python从上到下读取程序,还是从头到尾读取它?

这有意义吗?我不确定如何解释它。感谢您的任何帮助。 :) (python 2.7)

4 个答案:

答案 0 :(得分:6)

我认为你对参数传递的命名规则感到有些困惑。

考虑:

def foo(a, b):
    print a
    print b

您可以按如下方式致电foo

x = 1
y = 2
foo(x, y)

你会看到:

1
2

函数签名(函数定义的第一行)中的参数(a, b)的变量名称不必与调用函数时使用的实际变量名称一致。

当你打电话时,可以这样想:

foo(x, y)

它说:"调用函数foo;将x传递为a,将y传递为b"。此外,这里的参数作为副本传递,因此如果您要在函数内修改它们,它将不会更改函数外部的值,从调用它的位置。请考虑以下事项:

def bar(a, b):
    a = a + 1
    b = b + 2
    print a

x = 0
y = 0
bar(x, y)
print x
print y

你会看到:

1
2
0
0

答案 1 :(得分:2)

脚本从上到下运行。该函数在您调用时执行,而不是在您定义时执行。

我建议先尝试理解变量和函数参数传递等概念。

答案 2 :(得分:0)

def change(variable):
    print variable

var1 = 1
change(var1)

在上面的例子中,var1是主要执行线程中的一个变量。

调用change()之类的函数时,范围会发生变化。只要你仍然在函数的范围内,你在函数外声明的变量就不复存在了。但是,如果您传递一个参数,例如var1,那么您可以在函数内使用该值,通过函数声明中给出的名称:variable。但它与var 完全分开是相同的,但它是不同的变量

答案 3 :(得分:0)

您的问题与功能参数转移有关。

函数中有两种类型的参数传递:

  • 按值-------值在功能域中更改,但不在全局域中更改
  • 参考-------全局域中的值已更改

在python中,非原子类型通过引用传输;原子类型(如字符串,整数)按值传输。

例如,

案例1:

x = 20
def foo(x): 
    x+=10
foo()
print x // 20, rather than 30

案例2:

d = {}
def foo(x): x['key']=20
foo(d)
print d // {'key': 20}