我正在处理请求python库和烧瓶。
我想打开“example.com”页面,然后点击链接打开“example.com/linked_page.html”
我的计划是使用这样的请求会话(简化):
def main():
s = requests.Session()
d = {'session':s, 'e': None}
html = get_base_page(d)
def get_base_page(dict):
s = dict['session']
html = s.get("example.com")
return html
由于会话状态在函数内发生变化,会影响“main”(全局?)范围内“s”的值。还有什么好的讨论吗?
答案 0 :(得分:1)
两个s
变量彼此独立....除非您使用global s
。
答案 1 :(得分:1)
get_base_page
函数有自己的命名空间,因此两个s
变量之间不会产生干扰。
您可以从get_base_page
功能访问全局变量。
但是如果要为它们分配值,则需要将它们声明为global
。
否则它们将在函数的本地命名空间中创建,因为它确实发生在您的情况下。
有关名称空间和范围(LEGB规则)的详细教程,请参阅this文章
再次阅读您的问题,我认为我们需要澄清的是s
对象如何存储为session
词典中名为d
的键的值。
现在启动python并执行以下操作(>>>是python提示符):
>>> s = 42
>>> d = {'session': s, 'key2': 8}
>>> d
{'key2': 8, 'session': 42}
>>> s = 3
>>> d
{'key2': 8, 'session': 42}
当你说s = 3
时,你告诉python使s
名称指向/表示值3
。你不会覆盖价值本身。
现在让我们用我们定义的类的通用对象做同样的事情:
>>> class A(object):
... def __init__(self, n):
... self.n = n
...
>>> s = A(42)
>>> d = {'session': s, 'key2': 8}
>>> d['session'].n
42
>>> s.n = 30
>>> d['session'].n
30
看到区别? s
名称和session
键指向/表示相同的对象实例。因此,当您更改其属性(通过任一名称到达它们)时,更改将影响两者。
请参阅this文章了解不可变/可变对象。
练习所有python类型,看看会发生什么。玩得开心!