python

时间:2015-06-23 20:43:34

标签: python flask

我正在处理请求python库和烧瓶。

我想打开“example.com”页面,然后点击链接打开“example.com/linked_pa​​ge.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”的值。还有什么好的讨论吗?

2 个答案:

答案 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类型,看看会发生什么。玩得开心!