sinat_18437437 2021-10-03 18:10 采纳率: 100%
浏览 42
已结题

python对一个变量进行修改时,会同时对另外一个变量做同样的修改操作,是不是bug

下边是我的代码
运行时,对变量atoms2进行赋值操作时,会同时修改atoms1的内容
按理说不应该这样的啊,是我写的不对吗

import numpy as np
import random
import math
import scipy.optimize as opt



count = 0
re = 0.1564
u_exp =  3.07
a_f = 1.3
a_ca = 4.4
x = []
writes = []
result = ''


def calc_x2(atoms):
    x = 0
    y = 0
    z  = 0
    a2d = 2.542  
    b2a = 0.529177249

    for atom in atoms:
        x += (atom['site'][0]/b2a )* atom['q']

        y += (atom['site'][1]/b2a )* atom['q']
        z += (atom['site'][2]/b2a )* atom['q']
    x,y,z =x*a2d, y*a2d,z*a2d
    u = math.sqrt(x**2+y**2+z**2)
    x2 = (u -3.07) ** 2
    return x2

def make_atoms(atoms,x0):
    #x0 = [q_ca,beta_ca]
    q_ca = x0[0]
    beta_ca = x0[1]
    
    atoms[4]['q'] = q_ca
    atoms[5]['q'] = -(q_ca-2)
    
    atoms[4]['beta'] = beta_ca
    atoms[5]['beta'] = beta_ca

    return atoms
 
def cacl_ener(x0,atoms):
    k = 1/(4*math.pi*0.08854187818)
    v_sum = 0
    atoms[1]['site'] = np.array([x0[0],x0[1],x0[2]])
    atoms[3]['site'] = np.array([x0[3],x0[4],x0[5]])
    atoms[5]['site'] = np.array([x0[6],x0[7],x0[8]])
    atom = [0,1,2,3,4,5]
    for i in range(0,5):
        atom = atom[1:]
        bi = atoms[i]['beta']
        qi = atoms[i]['q']
        for j in atom:
            
            bj = atoms[j]['beta']
            
            
            qj = atoms[j]['q']

            r = np.linalg.norm(atoms[i]['site'] - atoms[j]['site'])
            bij = (bi * bj) /(math.sqrt(bi*bi+bj*bj))            
            erf= math.erf(bij * r)

            e_coul = k * qi * qj *erf /r
            v_sum += e_coul


    r_f_1 = np.linalg.norm(atoms[0]['site'] - atoms[1]['site'])
    r_f_2 = np.linalg.norm(atoms[2]['site'] - atoms[3]['site'])
    r_ca= np.linalg.norm(atoms[4]['site'] - atoms[5]['site'])
    v_pol_f_1 = k * (atoms[1]['q']**2/(2*a_f)) * r_f_1**2
    v_pol_f_2 = k * (atoms[3]['q']**2/(2*a_f)) * r_f_2**2
    v_pol_ca = k * (atoms[5]['q']**2/(2*a_ca)) * r_ca**2
    v_sum = v_sum + v_pol_f_1+ v_pol_ca   + v_pol_f_2
    return(v_sum)

def p_min(delta_x2,t):
    probability = np.exp(-delta_x2/t)
    return probability

def deal(atoms1,atoms2,delta_x2,t):
    if delta_x2 < 0:
        return atoms2
    else:
        return atoms1

def solve():
    atoms1 = atoms
    count = 0
    skl = 0
    t = 1000
    t_min = 1
    jishu = 0
    r = 1000
    count_skl_1 = 0
    count_skl_2 = 0
    while t >= t_min:
        jishu += 1
        t *= 0.95
    t = 1000
    x0 =([0, 1, -0.461,0, -1.669, -0.561,0., 0.    , 0.355])
    with open('x2.txt','w') as f:
        f.write('')
    while t >= t_min:
        for i in range(0,r): 
            
            write = {'id':0,'x2':'','atoms':atoms1}
            if skl == 1:
                count_skl_1 += 1
            elif skl == 2:
                count_skl_2 += 1
            if count % jishu == 0:
                count_1 = (count/jishu) /(r/100)
                s = str(count) + '|' + str(jishu*100)
                print(count_1,':','  1:',count_skl_1,'  2:',count_skl_2)
                count_skl_1 = 0
                count_skl_2 = 0
                if count == jishu * 100 -1:
                    print('\n')
            count += 1
            if count ==  1:
                result = opt.minimize(cacl_ener,x0,method='L-BFGS-B',args = atoms1)
                x0 = (result['x'][0],result['x'][1],result['x'][2],result['x'][3],result['x'][4],result['x'][5],result['x'][6],result['x'][7],result['x'][8])
                atoms1[1]['site'] = np.array([result['x'][0],result['x'][1],result['x'][2]])
                atoms1[3]['site'] = np.array([result['x'][3],result['x'][4],result['x'][5]])
                atoms1[5]['site'] = np.array([result['x'][6],result['x'][7],result['x'][8]])
                x2_1 = calc_x2(atoms1)
        
            q_ca = atoms1[4]['q']
            beta_ca = atoms1[4]['beta']

            delta_q_ca = random.uniform(-0.1,0.1)
            if q_ca + delta_q_ca > 20 or q_ca + delta_q_ca < 2:
                q_ca = q_ca - delta_q_ca
            else:
                q_ca = q_ca + delta_q_ca
            
            delta_beta_ca = random.uniform(-0.1,0.1)
            if beta_ca + delta_beta_ca >20 or beta_ca + delta_beta_ca < 0:
                beta_ca -= delta_beta_ca
            else:
                beta_ca += delta_beta_ca


            delta_atoms = [q_ca,beta_ca]
            atoms2 = make_atoms(atoms1,delta_atoms)


            result = opt.minimize(cacl_ener,x0,method='L-BFGS-B',args = atoms2)
            x0 = (result['x'][0],result['x'][1],result['x'][2],result['x'][3],result['x'][4],result['x'][5],result['x'][6],result['x'][7],result['x'][8])
            atoms2[1]['site'] = np.array([result['x'][0],result['x'][1],result['x'][2]])
            atoms2[3]['site'] = np.array([result['x'][3],result['x'][4],result['x'][5]])
            atoms2[5]['site'] = np.array([result['x'][6],result['x'][7],result['x'][8]])
            x2_2 = calc_x2(atoms2)
            delta_x2 = x2_2 - x2_1
            print(delta_x2)
            atoms1 = deal(atoms1,atoms2,delta_x2,t)

            if atoms1 == atoms2:                
                skl = 2
                print(skl)
                x2_1 = x2_2
            else:
                skl = 1
            write['id'] = count
            write['x2'] =x2_1
            write['atoms'] = atoms1
            writes.append(write)
            with open('x2.txt','a') as f:
                f.write(str(write) + '\n')
        t = t * 0.95
    result = atoms1
            

if __name__ == "__main__":
    atoms = [{'beta': 9.139, 'q': 5.590, 'site': np.array([0, 1.869, -0.361])}, \
                  {'beta': 9.139, 'q': -6.590, 'site': np.array([-0.23324962,  0.16647118,  0.29554485])}, \
                  {'beta': 9.139, 'q': 5.590, 'site': np.array([0, -1.869, -0.361])}, \
                  {'beta': 9.139, 'q': -6.590, 'site': np.array([-0.23324962,  0.16647118,  0.29554485])}, \
                  {'beta': 13.772, 'q': 20, 'site': np.array([0., 0.    , 0.325    ])}, \
                  {'beta': 13.772, 'q': -22, 'site': np.array([0.15000612, 0.0927579 , 0.29707778])}]
    count = 0
    re = 0.1564
    u_exp =  3.07
    a_f = 1.3
    a_ca = 4.4
    x = []
    writes = []
    result = ''
    solve()

  • 写回答

1条回答 默认 最新

  • Zl_? 2021-10-03 18:17
    关注

    不是bug
    atoms2 = atoms1,166行
    这里两个变量指向了同一个地址,所以他俩改一个另外一个也会改

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月11日
  • 已采纳回答 10月3日
  • 修改了问题 10月3日
  • 创建了问题 10月3日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度