0

标题可能不是我的问题的正确措辞,但我对编程还是很陌生,尤其是对 Web 开发等方面的新手。

在正常的 python 环境中,对变量的引用不会影响原始对象。所以:

x = 1
y = x
y += 1
print x,y
>>> 1, 2

同样,如果我这样做...

x = [[1,2], [3,4]]
y = x[0]
z = y[0] + 1
print x
>>> [[1, 2], [3, 4]]

但是,在 Google App Engine 中,如果我执行上述示例,则会得到:

print x
>>> [[2, 2], [3, 4]]

所以,我的问题是这个。怎么回事?

我有一个类似于 的列表x,但更大,我可以访问(无需修改)并使用该数据构建其他列表。然后,当我更改新列表的内容时,它也会更改原始列表中的内容。因此,当我刷新网页时,我希望得到与首次加载时相似的结果,但原始列表已完全改变。之后的每次刷新只会让情况变得越来越糟。现在,我花了几个小时逐行检查我的所有代码,现在我确信这不是我的代码。那么,GAE 的工作方式与我预期的不同吗?这是正常行为吗?更重要的是,我到底该如何修复它(让它像普通的 python 解释器一样工作)?

编辑:

好的,所以我刚刚确认了。我有一个全局不可变常量,称为SKILLS. 然后我做all_skills = SKILLS。稍后我循环all_skills并抽出 10 个随机技能(SKILLS 是一个包含表示游戏技能的列表的元组)并将它们分配给一个类实例变量。然后我确认 SKILLS 是未修改的,然后修改了类变量,当我重新检查 SKILLS 时,类变量中更改的所有技能也在 SKILLS 中更改,除非我完全误解了某些东西,否则这应该是不可能的。

如果您特别好奇,可以查看有问题的两个模块https://github.com/jtsmith1287/gurpscg/blob/master/charbuilder.pyhttps://github.com/jtsmith1287/gurpscg/blob/master /skills.py 如果您想查看应用程序的功能,只需加载http://gurpscgtest.appspot.com并刷新几次并查看表格。

4

2 回答 2

0

在我的本地 dev_appserver 中没有发生,我使用的是 appengine 1.7.5。可能是您的代码中的其他内容导致了这种行为

import webapp2

class MainPage(webapp2.RequestHandler):
    def get(self):
        x = [[1, 2], [3, 4]]
        y = x[0]
        z = y[0] + 1
        print x , y , z

app = webapp2.WSGIApplication(
    [
     ('/', MainPage)],
    debug=True)

结果

[[1, 2], [3, 4]] [1, 2] 2 状态:200 内容类型:text/html;charset=utf-8 内容长度:0 缓存控制:无缓存

于 2013-08-25T05:13:55.683 回答
0

您是在开发服务器中看到的,还是在部署时看到的?如果是前者,那我真的很惊讶——我们没有做任何改变 Python 核心语义的事情。

如果您在部署到appspot.com 时看到这种情况,那么您是否可能正在更改全局变量并期望该更改在请求中可见?如果是这种情况,有一个简单但可能不明显的解释:不能保证顺序请求由应用程序的同一实例提供服务。这是 App Engine 的功能之一:传入请求速率的增加会导致启动更多实例,从而可以分散增加的负载。(如果您启用了多线程,这会发生得更慢。)

这归结为 GAE 环境,global 主要用作不可变值的缓存。

于 2013-08-25T04:29:38.743 回答