Для неизменяемых объектов создание копии не имеет особого смысла, поскольку они не будут меняться. Для изменяемых объектов assignment
, copy
и deepcopy
ведут себя по-разному. Давайте поговорим о каждом из них с примерами.
Операция присваивания просто назначает ссылку источника на место назначения, например:
>>> i = [1,2,3]
>>> j=i
>>> hex(id(i)), hex(id(j))
>>> ('0x10296f908', '0x10296f908') #Both addresses are identical
Теперь i
и j
технически ссылаются на тот же список. Оба i
и j
имеют одинаковый адрес памяти. Любое обновление любого из них будет отражено в другом. например:
>>> i.append(4)
>>> j
>>> [1,2,3,4] #Destination is updated
>>> j.append(5)
>>> i
>>> [1,2,3,4,5] #Source is updated
С другой стороны, copy
и deepcopy
создают новую копию переменной. Итак, теперь изменения исходной переменной не будут отражаться на переменной копирования и наоборот. Однако copy(shallow copy)
не создает копию вложенных объектов, а просто копирует ссылку на вложенные объекты. Deepcopy рекурсивно копирует все вложенные объекты.
Некоторые примеры для демонстрации поведения copy
и deepcopy
:
Пример с плоским списком с использованием copy
:
>>> import copy
>>> i = [1,2,3]
>>> j = copy.copy(i)
>>> hex(id(i)), hex(id(j))
>>> ('0x102b9b7c8', '0x102971cc8') #Both addresses are different
>>> i.append(4)
>>> j
>>> [1,2,3] #Updation of original list didn't affected copied variable
Пример вложенного списка с использованием copy
:
>>> import copy
>>> i = [1,2,3,[4,5]]
>>> j = copy.copy(i)
>>> hex(id(i)), hex(id(j))
>>> ('0x102b9b7c8', '0x102971cc8') #Both addresses are still different
>>> hex(id(i[3])), hex(id(j[3]))
>>> ('0x10296f908', '0x10296f908') #Nested lists have same address
>>> i[3].append(6)
>>> j
>>> [1,2,3,[4,5,6]] #Updation of original nested list updated the copy as well
Пример с плоским списком с использованием deepcopy
:
>>> import copy
>>> i = [1,2,3]
>>> j = copy.deepcopy(i)
>>> hex(id(i)), hex(id(j))
>>> ('0x102b9b7c8', '0x102971cc8') #Both addresses are different
>>> i.append(4)
>>> j
>>> [1,2,3] #Updation of original list didn't affected copied variable
Пример вложенного списка используя deepcopy
:
>>> import copy
>>> i = [1,2,3,[4,5]]
>>> j = copy.deepcopy(i)
>>> hex(id(i)), hex(id(j))
>>> ('0x102b9b7c8', '0x102971cc8') #Both addresses are still different
>>> hex(id(i[3])), hex(id(j[3]))
>>> ('0x10296f908', '0x102b9b7c8') #Nested lists have different addresses
>>> i[3].append(6)
>>> j
>>> [1,2,3,[4,5]] #Updation of original nested list didn't affected the copied variable
Предполагая, что все остальное в коде работает должным образом. Затем вам нужно добавить следующую строку перед методом olMail.Send
. Пример:
olMail.attachments.Add Sheets("Sheet1").Range("E2").Value, olByValue, , "sampleFile"
Более подробную информацию о методе attachments.add можно найти здесь Вложения Добавить
Функция отправки почты будет выглядеть следующим образом:
[ 111]Правка 1: Полагаю, ваш вопрос был в том, как включить несколько вложений в электронное письмо. Тогда вы можете попробовать это:
Sub SendEmail(what_address As String, subject_line As String, mail_body As String)
Dim olApp As Outlook.Application
Set olApp = CreateObject("Outlook.Application")
Dim olMail As Outlook.MailItem
Dim lastRow As Integer
Set olMail = olApp.CreateItem(olMailItem)
'Provide the Column where the attachment links are stored. I guess its E in your case
lastRow = Sheets("Sheet1").Range("E" & Rows.Count).End(xlUp).Row
olMail.To = what_address
olMail.Subject = subject_line
olMail.Body = mail_body
'Loop through the column and add the attachments to the Email
For i = 2 To lastRow
.attachments.Add Sheets("Sheet1").Range("E" & i).Value, olByValue
Next i
olMail.Send
End Sub