Python列表追加元素重复添加

1 投票
1 回答
3837 浏览
提问于 2025-04-18 12:42

我刚开始学习Python,正在尝试使用Django。在处理网页请求时,我遇到了一些我觉得很奇怪的情况。我写了一个自己的类,继承了内置的 TemplateView 类,这样我就可以重写这个类的 get_context_data 方法。在我新版本的这个方法里,我像这样修改了 context

class adminUpload(TemplateView):
  template_name = "adminupload.tpl.html"

  def get_context_data(self,**kwargs):
    context = super(TemplateView, self).get_context_data(**kwargs)

    context['js_paths'] = webapp.settings.template['js_paths']

    logger.debug('adding')
    logger.debug( context['js_paths'] )

    context['js_paths'].append( '/static/path/to/js/file.js' )

    logger.debug( context['js_paths'] )

    return context

在我的网址路由中,我是这样把请求传递给这个类的:

url(r'^adminupload$', front.adminUpload.as_view() ),

但不知为什么,每次我重新加载页面时,我的 context['js_paths'] 列表都会多一个项目,内容是 '/static/path/to/js/file.js'。也就是说,如果我重新加载页面5次,这个列表就会包含5个项目,都是这个值。我确认这个方法每次请求只被调用一次,而且通过我设置的调试日志可以看到,列表确实在每次请求后变得更大。

我一定是漏掉了什么很简单的东西,可能是某种缓存,或者对模板上下文的理解不够。任何指点都会非常感谢。

1 个回答

3
context['js_paths'] = webapp.settings.template['js_paths']
context['js_paths'].append( '/static/path/to/js/file.js' )

这里创建了一个新的标识符,指向同一个列表,然后往这个列表里添加内容。其实你并没有复制这个列表。

所以每次调用 get_context_data 的时候,webapp.settings.template['js_paths'] 都在不断地被添加内容。

你可以考虑这样做:

context['js_paths'] = webapp.settings.template['js_paths'] + ['/static/path/to/js/file.js']

撰写回答