我迷茫和迷茫!关于返回对象的功能和范围。为什么从第一个函数返回的对象发生了变化?

时间:2017-01-28 19:23:00

标签: python function python-3.x scope

我是编程和自学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)

4 个答案:

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