python import os.path,关于python:困惑为什么导入os; os.environ [‘a’] =’x’; import os.path引发UnboundLocalError...

有人能解释为什么会发生以下情况? 我看看我应该使用`import os.path`还是`import os`? 这是内容丰富,模糊相似,但并没有真正为我澄清。

如果我注释掉import os.path或在import os之后直接添加它,则没有错误。

$ python -V

Python 2.7.2

$ cat min.py

import os

def main():

os.environ['blah'] = 'bloo'

import os.path

if __name__ == '__main__':

main()

$ python min.py

Traceback (most recent call last):

File"min.py", line 9, in

main()

File"min.py", line 4, in main

os.environ['blah'] = 'bloo'

UnboundLocalError: local variable 'os' referenced before assignment

$

不确定,但我怀疑'import os.path'算作在本地范围内写入os变量,所以,os在此之前不存在(这对我来说似乎是一个错误,os被视为一个 这里的任务)。 os.path应该是作业的目标。

因为导入也是一项任务。如果在main方法中执行import os.path,则表示os是本地名称,而Python不会在全局范围内查看您已导入的os。

非常简洁。 你用两句话说我十点钟。

史蒂夫是正确的,这是最好的答案,但史蒂夫的解释让我理解这一点:"Python有关于名称的可见性以及何时可以引用它们的规则。其中一条规则是不存在歧义。 关于是否要引用本地名称或全局名称的函数。如果在与全局名称相同的函数内的任何位置创建本地名称,则Python假定函数内对该名称的所有引用都引用 本地名称(除非您另有说明)。" 谢谢你们俩。

# assigns 'os' to global namespace

import os

def main():

os.environ['blah'] = 'bloo' # <== which 'os'?  python assumes local

# assigns 'os' to local namespace

import os.path

import做两件事。首先,它创建一个模块对象。其次,它为新创建的模块对象命名。赋予名称的是赋值,因此错误消息"UnboundLocalError: local variable 'os' referenced before assignment"。

Python有关于名称可见性以及何时可以引用它们的规则。其中一条规则是,函数中是否存在歧义,无论您是指要引用本地名称还是全局名称。如果在与全局名称相同的函数内的任何位置创建本地名称,则Python假定函数内对该名称的所有引用都引用本地名称(除非您另有说明)。

三个可能的修复。

删除本地导入:

import os

def main():

os.environ['blah'] = 'bloo'

删除全局导入并将本地导入移动到函数顶部

def main():

import os.path

os.environ['blah'] = 'bloo'

在函数开头声明os global,以便第一个引用使用全局:

import os

def main():

global os

os.environ['blah'] = 'bloo'

import os.path

关于进口的说明。

# has the same effect as 'import module'

# creates a reference named 'module'

import module.submodule

# imports submodule and creates a reference to it named 'submodule'

from module import submodule

# imports submodule and creates a reference to it named 'x'

import module.submodule as x

我之所以发生这种情况,是因为您在导入之前尝试使用库'os'。

你可以做

def main():

import os

#now you can use os.environment

os.environ['blah'] = 'bloo'

#you don't need to import os.path as os is already imported

if __name__ == '__main__':

main()

分配后的import os.path导致问题。 在你的例子中,如果我将import os移动到全局范围,那么一切都是笨拙的。 我同意我在技术上不需要import os.path,但我很好奇为什么这是一个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值