python-在同一函数中使用全局和局部变量

python-在同一函数中使用全局和局部变量,python,Python,在python中,当我尝试以下操作时: admin = "Vaibhav" def print_admin(default): # global admin if default == "default": print(admin) else: admin = "other" print(admin) print_admin("") print_admin("default") 这给了我一个错误: error:Unboun

在python中,当我尝试以下操作时:

admin = "Vaibhav"
def print_admin(default):
    # global admin
    if default == "default":
        print(admin)
    else:
        admin = "other"
        print(admin)
print_admin("")
print_admin("default")
这给了我一个错误:

error:UnboundLocalError: local variable 'admin' referenced before assignment
如果我使用global关键字,那么在这两种情况下它只使用global。 如果参数中没有给出“默认值”,我希望能够使用本地(“其他”),如果参数中没有给出,则使用全局(“Vaibhav”)

这在javascript中非常有效,但在python中却不行

执行相同操作的Javascript代码:

let admin_name = "Vaibhav";

function printAdminName(admin_name_default) {
    if (admin_name_default != "default") {
        let admin_name = "Other";
        console.log(admin_name)
    }
    else {
        console.log(admin_name);
    }
}
printAdminName("default");
printAdminName();
输出: 维巴夫 其他


**我还想知道为什么这在javascript而不是python中有效,因为两者都是非常相似的语言。我想知道是什么概念造成了这种差异。因为我花了很多时间从逻辑上理解它。

谈论变量的范围:

admin = "Vaibhav"
def print_admin(default):
    if default == "default":
        ## This is global
        global admin
        print(admin)
    else:
        ## This is local to your function
        print_admin.admin = "other"
        print(print_admin.admin)
print_admin("")
print_admin("default")

虽然我不太明白为什么您要在这个函数中注册一个全局变量,但是如果出于某种原因必须注册,您可以始终使用声明来约束您的局部变量。

在Python中,您不能使用相同的名称来引用局部变量和全局变量。例如,使用
global admin
强制所有出现的
admin
引用全局变量,这意味着更改
admin
的值也将更改全局定义的
admin
,这似乎不是您想要的

完全可以(和Pythonic)读取全局变量而不写入它们(更改它们),在这种情况下,不需要
global
关键字。考虑

admin = "Vaibhav"
def print_admin(default):
    if default == "default":
        # Read in the global admin
        admin_local = admin
    else:
        admin_local = "other"
    print(admin_local)
print_admin("")
print_admin("default")

在这里,我们通过不同的命名来区分全局版本和本地版本的
admin
。当您希望将两者都称为不同的变量时,这是必须的。

为什么不从
def print\u admin(user=admin)开始的可能重复:
Javascript和Python之间最相关的区别是Python缺少块局部变量。感谢您的ans(这是我第一次在SO中询问问题)!!我认为这将真正解决问题。通过将全局分配给新的局部n,然后使用它。这也有助于避免无意中更改全局变量值。@Vaibhav_M没问题。欢迎来到SO。