使用django视图时,为什么变量在python中的范围内共享

时间:2016-05-03 15:37:43

标签: python django

请注意这是一个非常特殊的Django问题,所以如果你知道Django Rest Framework你会理解它

所以我在Django休息框架中有一个视图,其中包含ridden上的更新函数和_has_permission辅助函数

def update(self, request, *args, **kwargs):
        permission, message = self._has_permission(data=request.data)
        if not permission:
            return Response({'error': message}, status=status.HTTP_403_FORBIDDEN)

        return super().update(request, *args, **kwargs)



    def _has_permission(self, data):
        """
       Resolves if the logged in user has permission to update the data given the type of data
       :param data:
       :return:
       """


        data['user_type'] = data['user_type'] if ('user_type' in data and data['user_type']) else None

        ....
        some checks
        ....
        return True, 'Has Permission'

如果函数_has_permission()看到&#39; user_type&#39;不在数据中,它在函数中设置数据[&#39; user_type&#39;] =无,但是当它出现时,request.data [&#39; user_type&#39;]现在存在并且变为无< / p>

如何在两个不同的范围内共享此字典。我认为函数有自己的范围

2 个答案:

答案 0 :(得分:1)

与你的断言相反,这是根本不是特定于DRF,而是一个非常通用的Python原则。

将任何参数传递给函数总是传递对象本身。如果然后在函数中改变该对象,那么对该对象的所有其他引用都将看到该修改,因为它们仍然是对同一对象的引用。

答案 1 :(得分:0)

默认情况下,在Python中,所有args都通过引用(或者某种类型)传递,这意味着,您传递的是对象的引用,而不是副本,因此如果您更改函数内的对象,那么影响对象本身,而不是它的副本。您可以在http://robertheaton.com/2014/02/09/pythons-pass-by-object-reference-as-explained-by-philip-k-dick/

查看更多详情