Python 为什么一个变量可以在定义函数后使用它来定义?

Python 为什么一个变量可以在定义函数后使用它来定义?,python,list,function,data-structures,arguments,Python,List,Function,Data Structures,Arguments,我有一个非常简单的问题,也许是愚蠢的问题: 为什么这样做有效 def print_list(): for student in student_list: print(student) student_list = ["Simon", "Mal", "River", "Zoe", "Jane", "Kaylee", "Hoban"] print_list() 我了解函数和参数的方式是,函数print\u list()不应该识别student\u list,因为我没有将

我有一个非常简单的问题,也许是愚蠢的问题:

为什么这样做有效

def print_list():
    for student in student_list:
        print(student)

student_list = ["Simon", "Mal", "River", "Zoe", "Jane", "Kaylee", "Hoban"]
print_list()

我了解函数和参数的方式是,函数
print\u list()
不应该识别
student\u list
,因为我没有将它指定为函数的参数。

在调用
print\u list()
时,已经将
student\u list
定义为全局变量

我的理解是,你的程序有三个部分

  • 定义打印列表()
  • 初始化学生列表(全局变量)
  • 调用打印列表()
  • 调用print_list()时,学生列表已经存在。此外,在函数中,您具有搜索变量(student_列表)的作用域: 1.本地作用域(它将失败,因为您没有定义它,只引用了它)
    2.全局作用域(它将成功,因为它在Python中刚刚初始化过,变量是在赋值时创建的。在您的例子中,
    student\u list
    是在全局作用域中赋值的,因此它是一个全局变量。(全局作用域是不在函数中的东西。)

    当Python在函数中遇到一个非局部变量的变量时(即,它没有作为参数传入,也没有在函数中赋值),它会自动在全局范围内查找该变量

    如果您想知道
    global
    语句的用途是什么,因为全局变量在函数中已经可见:
    global
    允许您重新分配全局变量,并使其在全局范围内生效。例如:

    def b():
        global a
        a = 5
    
    a = 4
    print(a)  # prints 4
    b()
    print(a)  # prints 5
    

    在大多数情况下,您不需要使用
    global
    语句,我建议您不要使用它,尤其是在您对Python有更丰富的经验之前(尽管如此,即使是有经验的Python程序员也不太会使用
    global

    哇,你太快了!谢谢你的回答。现在我想到两个问题:1.为什么我的列表被定义为全局变量?我想我必须使用全局语句。2.上面的代码和这个代码有什么区别?def print_list(list):对于列表中的I:print(I)student_list=[“Simon”,“Mal”,“River”、“Zoe”、“Jane”、“Kaylee”、“Hoban”]打印列表(学生列表)这是由于python的作用域行为。要理解这种行为,您可以在这里阅读教程的相关部分->1。python逐行运行并构建程序结构。您可以说所有未缩进的内容都是全局的。您有一个函数声明、一个列表和一个函数调用。函数调用实际上执行您的f函数,但从这个角度来看,你可以说它和其他函数是一样的(或者说@wim刚才说的)。2.结果应该是一样的,唯一的区别是,在你的原始代码中,你依赖范围,而在新的变体中,你使用参数。我很困惑!)我了解到一个函数需要从程序接收参数,否则当它们在函数中引用时,它将无法识别它们。是否可能我感到困惑,并且将两者分开是一种很好的做法?这对大多数编程语言都是正确的吗?嘿,“需要接收参数…”。。否则“是不准确的。在所有现代语言中都有作用域的概念-。它基本上说,当引用变量时,编译器/解释器会尝试在声明它的块中找到它(在您的例子中的函数)。如果失败,它会上升一个级别,依此类推,直到找到它。这非常有意义。谢谢John!我确实在您建议的上下文中了解了全局语句。我也理解为什么不推荐它(调试混乱、意外结果、没有单一的控制源和值更改等).我不知道的是术语全局范围的存在(如果不是在函数中,也不是在类中)。感谢大家提供了令人印象深刻且信息丰富的答案。我将进一步阅读有关全局范围的内容,尽管我从您的定义中理解了它。但是,我不确定我是否完全同意我的问题的编辑方式。我完全理解,在og代码执行序列中,列表分配发生在函数被调用,因此对我来说很有意义,因为Python知道在全局范围内查找变量,所以它可以使用代码中定义的内容。