-1

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

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 分别从函数中的第一个初始变量标签更改了 cheese_count 和 box_of_crackers 的变量(措辞?不确定我说的是不是正确的术语)。

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

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

那有意义吗?我不知道如何解释。感谢您的任何帮助。:) (python 2.7)

4

4 回答 4

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;传入xas a,传入yas 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
于 2012-12-10T01:47:27.870 回答
2

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

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

于 2012-12-10T01:47:44.957 回答
0
def change(variable):
    print variable

var1 = 1
change(var1)

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

当你调用像 change() 这样的函数时,范围会发生变化。只要您仍在该函数的范围内,您在该函数之外声明的变量就不再存在。但是,如果您将参数传递给它,例如 var1,那么您可以在函数中使用该值,使用您在函数声明中给出的名称:在这种情况下,variable. 但它! 相同,但它是一个不同var变量

于 2012-12-10T01:48:33.180 回答
0

您的问题与功能参数传输有关。

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

  • 按值 -------- 函数域中的值改变但全局域没有改变
  • 通过引用 -------- 全局域中的值更改

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

例如,

情况1:

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

案例二:

d = {}
def foo(x): x['key']=20
foo(d)
print d // {'key': 20}
于 2012-12-10T01:54:07.680 回答