我是编程和自学python的新手。
我创造了两个功能。第一个返回一个objectA。第二个接受objectA作为参数。如何保持一个物体"活着"功能之间?
listA = "" # a string
print(type(listA))
def one():
listA = [1,3,2,4] # within this function, listA is now a list object
print (type(listA))
print ("def one:", (listA))
return listA # returning a list object called listA
def two(listA): # def two() recieves object "listA" but its no longer a list object
print(type(listA)) # why is listA not a list object?
print("def two:", (listA))
one()
two(listA)
答案 0 :(得分:1)
这就像问“我在我家的墙上有一张照片,当我访问一个朋友的房子时,他们也有一张照片,但它有所不同。为什么它不同?如果它们是两个picture
不应该是一样的吗?“。
然后你到外面看另一张照片,再次不同了。
这就是scope
- 函数中的代码被分组/隔离/与其他代码分开,该代码中的变量名称与该代码外部的变量名称不同。 名称在不同的地方可能是相同的,但这并不能使它们完全相同。
您的代码正在做什么:
# --- 'outside world' scope at this level
worldListA = "" # a string
print(type(worldListA))
def one():
# --- function scope starts
oneListA = [1,3,2,4] # within this function, oneListA is now a list object
print (type(oneListA))
print ("def one:", (oneListA))
return oneListA # returning whatever "oneListA" means in this scope region
# --- function scope ends
def two(twoListA): # def two() recieves /anything/ and gives it the name "twoListA" inside this /scope/ region
# --- function scope starts
print(type(twoListA)) # why is twoListA not a list object?
print("def two:", (twoListA))
# --- function scope ends
# --- 'outside world' scope again at this level
# this function call one() is going to return /something/
# and we're not catching what comes out of it
# so it's not going to go anywhere and will be thrown away
one()
# call the function two() and pass in the thing called "worldListA" from
# the world scope
# that content will become named as 'twoListA' inside the two() function
two(worldListA)
# what you expected to happen was this code:
worldListA = one()
two(worldListA)
注意我已经更改了变量名称和注释。
然后是的,您可以更改所有范围中的所有变量以使其具有完全相同的名称 - > 但这并不会使它们成为同一个变量。
NB。如果你的房子没有picture
,你可以透过窗户看到外面世界的照片。如果你的函数没有一个名称的变量,那么Python将尝试从外部范围的下一级获得一个。
答案 1 :(得分:0)
这是一个范围问题。在one()
范围内,您更改了listA
的类型。但是在全球范围内(one()
之外),listA
仍然是一个字符串。
返回新的listA
还不足以改变这一点。您必须将值分配给在全局范围中定义的变量,可能如下:
listA = one()
two(listA)
更多信息:http://python-textbok.readthedocs.io/en/1.0/Variables_and_Scope.html
答案 2 :(得分:0)
您使用名称listA
为三个完全独立的变量感到困惑。在文件顶部声明的全局变量,one
中的局部变量和two
的参数都什么都没有彼此相关。
在函数之间保留变量的方法是捕获结果,然后将其传递给下一个。目前发生的事情是您从one
返回数据,然后将其丢弃;全局变量未被修改。
你需要这样做:
new_listA = one()
two(new_listA)
答案 3 :(得分:-1)
您可以使用global
关键字指向全局范围内的listA。
所以在功能one
中你说global listA