我可以将值重新分配给python中的相同变量

时间:2011-05-22 12:45:41

标签: python string

我在python中有这个变量

DATE_FILENAME =  datetime.datetime.now().strftime("%b-%d-%Y-%I%M%p")

现在这应该每次都有diff值。 但我听说字符串是不可变的,这意味着它只能保存一个值

结果为_May-22-2011-1002PM.tar.gz

我的脚本花了3分钟备份8个文件夹,但所有文件夹都有相同的date_filename。所以我想知道为什么它没有被打开

4 个答案:

答案 0 :(得分:7)

编辑:让我澄清一下:你在模块中定义一次这个常量吗?在这种情况下,它不会改变;每次要编写文件时都必须更新名称绑定。一个简单的方法是编写一个小函数get_name,每次调用它时都会生成一个新名称。

字符串不变的原因是,如果此代码处于模块级别(无缩进),那么它将仅在执行模块时执行一次。之后它不会改变。

这是与字符串不变性有关的另一个问题。


执行此行时,解释器将查找系统时间,根据strftime的字符串参数对其进行格式化,并将值存储在变量中。

关于Python中的名称绑定,这里有一点很重要。考虑一下

foo = 1

你可能想知道这里幕后发生了什么。当解释器看到这一行时,它会做两件事:

  1. 它创建一个整数对象并将其存储在某个内部表中。
  2. 它将名称foo“绑定”到此对象;换句话说,它记录了foo在某个内部表中的这个对象的事实。
  3. 重要的一点是,foo只是我们可能调用的对象的名称1.特别是,您可以通过重新绑定来为foo创建其他名称,例如foo = 2 }。但是你无法改变1

    以完全相同的方式,您无法更改可能创建的日期时间字符串。那个对象是不可改变的。但是你可以让名字指向不同的字符串或任何类型的不同对象!

答案 1 :(得分:1)

字符串是不可变的,但名称绑定不是。您可以随时为DATE_FILENAME分配新值。

如果您希望每次访问DATE_FILENAME都有不同的值,那就更难了。我猜你可以通过定义一个类并覆盖__str__()方法来实现。

答案 2 :(得分:0)

是的,DATE_FILENAME只有在分配后才会保持一个常量值,但它与不可变的字符串无关,这就是变量赋值在Python中的工作方式。变量只是名称,对变量的赋值意味着您要求计算机在右侧计算表达式,并将其值存储在左侧的名称中。

如果您希望DATE_FILENAME每次使用时都不同,那么您正在寻找一种称为延迟评估值的东西,这种东西会根据其赋值表达式重新计算值你使用它的时间(通过参考它)。在Python中执行此操作的自然方法是将datetime.datetime.now().strftime("%b-%d-%Y-%I%M%p")放入函数中。

def datetime_now_in_string():
    return datetime.datetime.now().strftime("%b-%d-%Y-%I%M%p")

DATE_FILENAME = datetime_now_in_string()

date_filename = lambda: datetime.datetime.now().strftime("%b-%d-%Y-%I%M%p")

file_name = date_filename() + '.txt'

你明白了。

答案 3 :(得分:0)

对象的不变性意味着,一旦在内存中创建了对象,它就只能被销毁。在字符串的上下文中:

DATE_FILENAME =  datetime.datetime.now().strftime("%b-%d-%Y-%I%M%p") 
id(DATE_FILENAME) 
>>> 139734827954224
DATE_FILENAME = DATE_FILENAME.upper() # creating a new string here
id(DATE_FILENAME) 
>>> 30526192