重铸Python变量

时间:2016-05-01 17:01:03

标签: python python-2.7

在python中,我将变量设置为字符串,即用户名:

og:url

当我以列表的形式检索用户详细信息时,我想重用变量:

self.loggedInUser = "Hanna"

是否可以这样做,可能更重要的是,这是不好的做法吗?

ħ

3 个答案:

答案 0 :(得分:0)

Python允许您随时更改变量的值,因此当然可以将self.loggedInUser的值从string更改为list或{ {1}},或任何其他类型的对象。

但这可能会令人困惑,如果代码期望某种对象并找到不同的类型,可能会导致代码出错,因此最好将其拆分,比如{{1和self.loggedInUser。

答案 1 :(得分:0)

有可能,python变量可以改变它们的类型。 关于不良做法......对此没有规定。就个人而言,我认为它可能会导致很多问题,即将用户带入函数,而不知道它是完整用户还是只知道名称。为什么不是字典?这样用户将始终是一本字典,但未经检索的属性只是在那里。 顺便说一句,在你写的行中它不是一个列表而是一个元组(元组使用圆括号 - (),列表使用方括号 - [])

答案 2 :(得分:0)

在Python中,变量不是强制作为一种类型,变量是对某些对象的引用,如果更改的那些引用仍然是引用。因此,将变量从一个对象更改为另一个不会更改此对象,而是更改引用。

这些操作仅适用于参考:

variable1 = 'ala'
variable1 = []
variable1 = {}

这些操作是关于变量引用的对象的值(inplace):

variable1 ='ala'
variable1 +='o' #variable1 -> 'alao'

所以在你改变的情况下:

self.loggedInUser = "Hanna"

self.loggedInUser = (0, "Hanna", "hash", "UID")

您只参与参考...

也可以这样做:

self.loggedInUser = "Hanna"
tp=type(self.loggedInUser)
if tp==str:
   self.loggedInUser = (0, self.loggedInUser, "hash", "UID")
elif tp==tuple:
   self.loggedInUser = (0, self.loggedInUser[1], "hash", "UID")
else:
   print 'sorry, something went wrong...'

带有覆盖引用的未使用对象将变为垃圾。在Cython中,您可以使用cdef定义变量类型。

字典和列表也很好......

以下是自动生存字典的示例:

class vividict(dict):  
    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            value = self[item] = type(self)()
            return value

有了这个,你可以这样做:

self.loggedInUsers=vividict()

self.loggedInUsers['user0']['name']='Hanna'
self.loggedInUsers['user0']['key1']='val1'
self.loggedInUsers['user0']['key2']='val2'
self.loggedInUsers['user0']['key3']='val3'
...