我在python中有这个变量
DATE_FILENAME = datetime.datetime.now().strftime("%b-%d-%Y-%I%M%p")
现在这应该每次都有diff值。 但我听说字符串是不可变的,这意味着它只能保存一个值
结果为_May-22-2011-1002PM.tar.gz
我的脚本花了3分钟备份8个文件夹,但所有文件夹都有相同的date_filename。所以我想知道为什么它没有被打开
答案 0 :(得分:7)
编辑:让我澄清一下:你在模块中定义一次这个常量吗?在这种情况下,它不会改变;每次要编写文件时都必须更新名称绑定。一个简单的方法是编写一个小函数get_name
,每次调用它时都会生成一个新名称。
字符串不变的原因是,如果此代码处于模块级别(无缩进),那么它将仅在执行模块时执行一次。之后它不会改变。
这是与字符串不变性有关的另一个问题。
执行此行时,解释器将查找系统时间,根据strftime
的字符串参数对其进行格式化,并将值存储在变量中。
关于Python中的名称绑定,这里有一点很重要。考虑一下
行foo = 1
你可能想知道这里幕后发生了什么。当解释器看到这一行时,它会做两件事:
foo
“绑定”到此对象;换句话说,它记录了foo
在某个内部表中的这个对象的事实。重要的一点是,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