在python中设置字典值不会更新该值吗?

在python中设置字典值不会更新该值吗?,python,dictionary,Python,Dictionary,我试图简单地替换两个字符串中丢失的日期值,但将它们拆分成一个年、月等的字典。然而,我遇到了一个非常奇怪的问题,我在谷歌搜索了20分钟后没有找到答案 这是我的密码: def date_split(date): parts = date.split('-') if len(parts) == 1: year = parts[0] dates = {'y' : year} if len(parts) == 2: year = pa

我试图简单地替换两个字符串中丢失的日期值,但将它们拆分成一个年、月等的字典。然而,我遇到了一个非常奇怪的问题,我在谷歌搜索了20分钟后没有找到答案

这是我的密码:

def date_split(date):
    parts = date.split('-')
    if len(parts) == 1:
        year = parts[0]
        dates = {'y' : year}
    if len(parts) == 2:
        year = parts[0]
        month = parts[1]
        dates = {'y' : year, 'm' : month}
    if len(parts) == 3:
        year = parts[0]
        month = parts[1]
        day = parts[2]
        dates = {'y' : year, 'm' : month, 'd' : day}
    return dates

def recompile(date):
    lista = list(date.values())
    date = "-".join(lista)
    return date

std = "2018-07-18"
x = "XXXX-01"

if date_split(x)['y'] == 'XXXX':
    new = str(date_split(std)['y'])
    date_split(x)['y'] = new
    date = recompile(date_split(x))
    print(date)
我刚开始玩弄它,所以它很粗糙,但我正在努力。然而,虽然date_splitstd['y']打印为2018年,但在date_splitx['y']=new之后,date_splitx['y']的值仍打印为XXXX。因此,字典不会更新该值。关于python中词典的工作方式,我有什么遗漏吗?我对它很陌生。我还尝试了不同形式的dictionary update命令


将Python 3.6与Anaconda一起使用。

可以更改函数的返回值。因为你没有把它放在任何地方,它就丢了。相反,做一些类似的事情

 custom_date = date_split(x)
 custom_date['y'] = new
 date = recompile(custom_date)
每次调用date_splitx时,它都会返回一个新的dict,因此更新它不会对下一次调用产生影响。相反,您应该将date_splitx的返回值指定给一个变量,然后使用该变量进行进一步处理

std = "2018-07-18"
x = "XXXX-01"
s = date_split(x)
if s['y'] == 'XXXX':
    new = str(date_split(std)['y'])
    s['y'] = new
    date = recompile(s)
    print(date)

无法保存函数调用的更改,必须将其存储在变量中。

正如其他人所说,您需要保存日期分割返回的字典,以便修改它。然而,您的date_split函数比它需要的要大得多,所以我已经使用编写了一个更紧凑的版本

您的重新编译函数在早期版本的Python上并不总是能正常工作,其中dict是一个无序的集合,但在Python 3.6+上可以,因为dict现在保留了插入顺序。另外,不需要在new=strdate_splitstd['y']中调用str。date_split返回的dict中的所有值都已经是字符串

def date_split(date):
    return dict(zip("ymd", date.split("-")))

def recompile(date):
    return "-".join(date.values())

std = "2018-07-18"
x = "XXXX-01"

x_split = date_split(x)
print("Original", x_split)
if x_split["y"] == "XXXX":
    x_split["y"] = date_split(std)["y"]
    print("Updated ", x_split)
    date = recompile(x_split)
    print("String  ", date)
输出


函数返回一个新的dictionary对象。日期分割X['y']=。。。生成新的dictionary对象,修改它,然后。。。这本字典丢了,因为没有其他东西引用它。共享函数修改的dictionary对象,或者首先存储date\u split的结果,以便以后再次引用。谢谢大家!应该想到这一点
def date_split(date):
    return dict(zip("ymd", date.split("-")))

def recompile(date):
    return "-".join(date.values())

std = "2018-07-18"
x = "XXXX-01"

x_split = date_split(x)
print("Original", x_split)
if x_split["y"] == "XXXX":
    x_split["y"] = date_split(std)["y"]
    print("Updated ", x_split)
    date = recompile(x_split)
    print("String  ", date)
Original {'y': 'XXXX', 'm': '01'}
Updated  {'y': '2018', 'm': '01'}
String   2018-01